{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# Использование LlamaQueryEngineRetriever вместе с Langchain\n",
    "1. Устанавливаем нужные пакеты"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "is_executing": true
    }
   },
   "outputs": [],
   "source": [
    "!pip install llama_index wikipedia gigachain openai\n",
    "!pip uninstall -y langchain"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "2. Загружаем статью из Википедии для поиска по ней\n",
    "3. Инициализируем VectorStoreIndex где будут храниться семантические данные по статье"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "from llama_index import VectorStoreIndex, download_loader\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = \"<Ключ OpenAI для получения с их стороны ембедингов>\"\n",
    "\n",
    "WikipediaReader = download_loader(\"WikipediaReader\")\n",
    "\n",
    "loader = WikipediaReader()\n",
    "\n",
    "documents = loader.load_data(\n",
    "    pages=[\"Московский метрополитен\"], auto_suggest=False, lang=\"ru\"\n",
    ")\n",
    "\n",
    "index = VectorStoreIndex.from_documents(documents)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "4. Инициализируем класс LlamaQueryEngineRetriever, который будет искать документы силами LLamaIndex"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from langchain.retrievers import LlamaQueryEngineRetriever\n",
    "from llama_index.response_synthesizers import ResponseMode, get_response_synthesizer\n",
    "\n",
    "response_synthesizer = get_response_synthesizer(response_mode=ResponseMode.NO_TEXT)\n",
    "query_engine = index.as_query_engine(\n",
    "    response_synthesizer=response_synthesizer,\n",
    ")\n",
    "retriever = LlamaQueryEngineRetriever(\n",
    "    query_engine=query_engine,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "5. Инициализируем цепочку RetrievalQA, отвечающая на вопросы пользователя, исходя из документов, которые мы нашли"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA\n",
    "from langchain.chat_models import GigaChat\n",
    "from langchain.prompts import PromptTemplate\n",
    "\n",
    "llm = GigaChat(\n",
    "    # тут данные для входа в GigaChat\n",
    ")\n",
    "\n",
    "prompt_template = \"\"\"Используя только контекст и не свои знания ниже дай ответ на вопрос (Question). Не используй свои знания только контекст.\n",
    "КОНТЕКСТ\n",
    "-----\n",
    "{context}\n",
    "-----\n",
    "Question: {question}\n",
    "AI:\"\"\"\n",
    "PROMPT = PromptTemplate(\n",
    "    template=prompt_template, input_variables=[\"context\", \"question\"]\n",
    ")\n",
    "\n",
    "qa = RetrievalQA.from_chain_type(\n",
    "    llm=llm,\n",
    "    chain_type=\"stuff\",\n",
    "    retriever=retriever,\n",
    "    chain_type_kwargs={\"prompt\": PROMPT},\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "6. Прогоняем вопрос"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": "'Метротур — это проект, организованный Городским экскурсионным бюро и Московским метрополитеном, который предоставляет возможность пройти трехдневное обучение и узнать больше о истории развития метро, его правилах и эксплуатации. В рамках программы \"Метротур\" проводятся экскурсии по публично доступным станциям метро.'"
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qa.run(\"Что такое метротур?\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
